"use strict";
var hasTools;
(function (hasTools) {
    let data2 = {
        "1456": 0, ada: 0, sdf: 0
    };
    let dat2 = {
        "skda": 123
    };
    // type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
    class Pp {
        constructor(age, uname) {
            this.age = age;
        }
        static getName() {
            return Pp.uname;
        }
        getAge() {
            return this.age;
        }
    }
    let asdsad = [1, '1'];
    let sadasd = ['1', 1];
    // NoInfer 是一种技巧，用来阻止 TypeScript 推导泛型参数。
    // 这通常是用来强制某个参数必须从前面的参数推导出类型后再验证，而不能自己影响推导过程。
    function createStreetLight(colors, defaultColor) {
        // ...
    }
    createStreetLight(["red", "yellow", "green"], "red"); // OK
    createStreetLight(["red", "yellow", "green"], "blue"); // Error
    // NoInfer 是什么？
    // NoInfer 是一种技巧，用来阻止 TypeScript 推导泛型参数。这通常是用来强制某个参数必须从前面的参数推导出类型后再验证，而不能自己影响推导过程。
    // 常见写法如下：
    //     type NoInfer<T> = [T][T extends any ? 0 : never];
    //     这个类型包装方式让 TypeScript 不会从这个位置去推断类型 T，而是只能接受已经确定的 T。
    // 解释这两个调用：
    // ✅ OK：
    //     createStreetLight(["red", "yellow", "green"], "red");
    //     colors 是 ["red", "yellow", "green"]
    //     TypeScript 推导出 C = "red" | "yellow" | "green"
    //     defaultColor 是 "red"，满足 "red" extends C
    // ✅ 所以通过。
    //     createStreetLight(["red", "yellow", "green"], "blue");
    //     colors 推导出 C = "red" | "yellow" | "green"
    ////     defaultColor 是 "blue"，它 不属于 C 的联合类型
    //     由于 NoInfer<C> 强制类型校验而不是重新推导，"blue" 被严格验证是否在 "red" | "yellow" | "green" 中
    /// ❌ "blue" 不符合，所以报错
})(hasTools || (hasTools = {}));
